<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.6" />
<title>Release notes for Gerrit 2.1</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }


/*
 * xhtml11 specific
 *
 * */

tt {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

.monospaced {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Release notes for Gerrit 2.1</h1>
<span id="revnumber">version 2.1 (from v2.1.1.1-104-gc20e283)</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.1 is now available in the usual location:</p></div>
<div class="paragraph"><p><a href="http://code.google.com/p/gerrit/downloads/list">http://code.google.com/p/gerrit/downloads/list</a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_site_path_layout">New site_path Layout</h2>
<div class="sectionbody">
<div class="paragraph"><p>The layout of the <tt>$site_path</tt> directory has been changed in 2.1.
Configuration files are now stored within the <tt>etc/</tt> subdirectory
and will be automatically moved there by the init subcommand.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_upgrading_from_2_0_x">Upgrading From 2.0.x</h2>
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre><tt>If the server is running a version older than 2.0.24, upgrade the
database schema to the current schema version of 19.  Download
'schema-upgrades003_019.zip' from the download area and run the
scripts by hand as listed in README until the server is caught up.</tt></pre>
</div></div>
<div class="paragraph"><p>Run init to convert the layout of $site_path:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar gerrit.war init -d $site_path</tt></pre>
</div></div>
<div class="paragraph"><p>If there is a GerritServer.properties file handy, ensure it is in the
current working directory or inside of $site_path when running init.
If present, init will reuse this information rather than prompting
for it.  If the file is not found, init will prompt for database
connection information.</p></div>
<div class="paragraph"><p>While moving the server&#8217;s configuration files into the new
etc/ subdirectory, init will also move secret settings such as
sendemail.smtpPass and ldap.password out of gerrit.config into a
read-protected secure.config file.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_daemon_mode">New Daemon Mode</h2>
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.1 and later embeds the Jetty servlet container, and
runs it automatically as part of <tt>java -jar gerrit.war daemon</tt>.
This is the preferred method of running Gerrit Code Review, and is
how sites like review.source.android.com are operating.</p></div>
<div class="paragraph"><p>To simplify management on UNIX systems an rc.d style startup script
is created in <tt>$site_path/bin/gerrit.sh</tt>.  This script can be used
to start and stop the background daemon process.  When started
from this script the daemon calls itself <tt>GerritCodeReview</tt> in ps,
but may still show up in top as <tt>java</tt>.</p></div>
<div class="paragraph"><p>Configuration of the daemon is handled by gerrit.config.  For more
information see the 2.1 documentation.</p></div>
<div class="paragraph"><p><a href="http://gerrit.googlecode.com/svn/documentation/2.1/index.html">http://gerrit.googlecode.com/svn/documentation/2.1/index.html</a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_features">New Features</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
issue 19     Link to issue tracker systems from commits
</p>
<div class="paragraph"><p>Hyperlinks from commit messages and any inline comments to
bug tracking systems can be enabled by configuring one or
more commentlink regular expressions in gerrit.config.</p></div>
</li>
<li>
<p>
Git replication security
</p>
<div class="paragraph"><p>Git replication can now be controlled on the sending side by
configuring one or more authGroups for a remote and granting
READ +1 access to only certain projects.</p></div>
</li>
<li>
<p>
Better repo upload/git push throughput
</p>
<div class="paragraph"><p>MINA SSHD was misconfiguring the host&#8217;s TCP/IP stack, this
limited throughput of git push to under 16 KiB/s.  Fixed.
Its such a huge improvement that its an important feature,
rather than a bug fix.  :-)</p></div>
</li>
<li>
<p>
issue 320    Queue SSH commands and ensure consistent throughput
</p>
<div class="paragraph"><p>SSH commands are entered into a queue and executed in FIFO order
as processor capacity becomes available.  The queue enables
the server to work on a finite number of commands at once and
ensures running commands complete in a timely fashion, no matter
how many concurrent connections are being established.
The queue allows sites to maintain consistent throughput without
thrashing, even as the number of requests increase beyond server
capacity.  The change was made in anticipation of <tt>repo sync</tt>
learning how to fetch all projects at once, inducing a load of
over 200 concurrent commands per user/Android checkout.
Server administrative commands such as kill or gsql (below) bypass
the queue and are allowed to execute as soon as they are received.</p></div>
</li>
<li>
<p>
kill: Support killing any queued task
</p>
<div class="paragraph"><p>A new administrative kill command was introduced to terminate
any queued or running tasks.  Unlike UNIX kill, a killed task
will continue until its next safe interruption point, which is
usually at the next network read or write.</p></div>
</li>
<li>
<p>
issue 327    gsql: query tool on command line and SSH
</p>
<div class="paragraph"><p>Gerrit supports an interactive SQL query tool for administrators.
The query tool is available over SSH as <tt>gerrit gsql</tt>, or locally
as <tt>java -jar gerrit.war gsql</tt>.  The query tool is primarily
useful with H2 databases, where the database is only accessible
to the running Java process.</p></div>
</li>
<li>
<p>
issue 202    Self contained daemon mode
</p>
</li>
<li>
<p>
issue 328    daemon: Automatically log into $site_path/logs
</p>
</li>
<li>
<p>
daemon: Automatically compress our log files
</p>
<div class="paragraph"><p>As noted above, Jetty 7.0.1.v20091125 is now bundled, making new
site installation easier.  Logs from daemon mode are written
out to the site&#8217;s logs/ subdirectory.  Logs are rotated and
compressed daily.</p></div>
</li>
<li>
<p>
issue 330    init: Create a command to setup a new site
</p>
</li>
<li>
<p>
issue 343    init: Create database indexes during schema creation
</p>
</li>
<li>
<p>
Remove CreateSchema command
</p>
<div class="paragraph"><p>The init command can be used to initialize a new site, or
as noted above, to upgrade an existing site to the current
software version.  Since init now does the work of CreateSchema,
and everything else that used to be listed out as individual
steps in the installation guide, CreateSchema was deleted.</p></div>
</li>
<li>
<p>
issue 325    Allow secure.config to overlay gerrit.config
</p>
</li>
<li>
<p>
Configure database from gerrit.config
</p>
<div class="paragraph"><p>Database connectivity is now configured out of gerrit.config
and secure.config, rather than GerritServer.properties.</p></div>
</li>
<li>
<p>
Bundle PostgreSQL, H2, DBCP, MySQL, Bouncy Castle
</p>
<div class="paragraph"><p>JDBC drivers for PostgreSQL, H2, and the Apache Commons DBCP
connection pool implementation are now bundled, reducing the
number of external dependencies that must be obtained before
getting a working installation.
The MySQL driver is automatically downloaded and verified by
init if required, as is the Bouncy Castle Crypto provider.
These JARs are not packaged in the standard distribution due to
export and/or license restrictions.</p></div>
</li>
<li>
<p>
issue 183    Support invoking gitweb from within Gerrit
</p>
<div class="paragraph"><p>The standard gitweb.cgi can now be automatically configured and
executed through Gerrit&#8217;s servlet container, making it easier to
publish a repository for browsing on the web.
Project level access controls are honored when browsing through
this gitweb interface.</p></div>
</li>
<li>
<p>
issue 105    Support OpenID when behind an HTTP proxy
</p>
</li>
<li>
<p>
issue 323    Use JGit&#8217;s http_proxy based initialization
</p>
<div class="paragraph"><p>HTTP proxies are now supported for OpenID authentication, as
well as for init&#8217;s optional external library download.</p></div>
</li>
<li>
<p>
Add a Register link when using LDAP authentication
</p>
<div class="paragraph"><p>When auth.type is LDAP the Register link in the top right corner
can point to an administrator defined URL.  This external URL
might be as simple as a <em>mailto:&#8230;</em> link, to help the user
request a new LDAP account from the directory administrators.</p></div>
</li>
<li>
<p>
Switch remote JSON services to use JSON-RPC 2.0
</p>
<div class="paragraph"><p>The JSON-RPC interface now speaks the JSON-RPC 2.0 draft
specification, in addition to the prior JSON-RPC 1.1
specification previously used.</p></div>
</li>
<li>
<p>
issue 336    Update MINA SSHD to SVN 891122
</p>
</li>
<li>
<p>
issue 324    Update JGit to 0.5.1.51-g96b2e76
</p>
</li>
<li>
<p>
Update JUnit to 3.8.2
</p>
</li>
<li>
<p>
Update args4j to 2.0.16
</p>
</li>
<li>
<p>
Update slf4j-log4j12 to 1.5.8
</p>
</li>
<li>
<p>
Update Ehcache to 1.7.1
</p>
</li>
<li>
<p>
Update commons-pool to 1.5.4
</p>
</li>
<li>
<p>
Update H2 to 1.2.125
</p>
</li>
<li>
<p>
Update to gwtjsonrpc 1.2.0, gwtexpui 1.1.4
</p>
<div class="paragraph"><p>Most dependencies were updated to their current stable versions.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_bug_fixes">Bug Fixes</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
issue 259    Improve search hint to include owner:email
</p>
<div class="paragraph"><p>The hint text in the search box in the upper right corner has
been improved to suggest owner:email and reviewer:email, as
these tags were not discoverable.</p></div>
</li>
<li>
<p>
issue 335    daemon: Refuse to launch unless gerrit.config exists
</p>
<div class="paragraph"><p>Gerrit now refuses to launch until the site path has been
properly initialized with init.  This is true both in daemon
mode and also when deployed inside of any servlet container.</p></div>
</li>
<li>
<p>
issue 152    Allow adding users who are missing a preferred email
</p>
<div class="paragraph"><p>The user suggestion boxes now permit adding a user that has not
yet selected a preferred email address on their contact panel.</p></div>
</li>
<li>
<p>
issue 319    Automatically set preferred email to first configured
</p>
<div class="paragraph"><p>If a user has no email addresses, the first address they register
through the next OpenID login, LDAP login, or <em>Register New Email</em>
feature will be automatically set as the preferred email address
for their account.</p></div>
</li>
<li>
<p>
issue 356    Fix committer identity on cherry-pick
</p>
<div class="paragraph"><p>The committer identity created when cherry-picking a change was
formatted incorrectly, it used the internal account identity.
Fixed to use the submitter&#8217;s preferred email address only.</p></div>
</li>
<li>
<p>
issue 345    Make "call11" readable in file content
</p>
<div class="paragraph"><p>The prior font made the string "call11" (c-a-ell-ell-one-one)
impossible to read because the ell and one looked the same.
Fixed by changing to different fonts for the fixed width file
content display.</p></div>
</li>
<li>
<p>
Automatically make first user account administrator
</p>
<div class="paragraph"><p>To simplify installation, the first user to login to a brand
new site is added to the <em>Administrators</em> group.  This avoids
the need to update the database manually via SQL and restart
the daemon to have it be picked up.</p></div>
</li>
<li>
<p>
Always trim Change-Id lines to handle whitespace
</p>
<div class="paragraph"><p>Some users were adding trailing whitespace on a Change-Id line
by accident, causing Gerrit to not always honor it when uploading
a replacement patch.  Fixed.</p></div>
</li>
<li>
<p>
Fix duplicate branches in the branches panel
</p>
<div class="paragraph"><p>The Branches tab under a project displayed the HEAD branch twice,
but every other branch once.  Fixed.</p></div>
</li>
<li>
<p>
Enforce all HTTP requests through SSL
</p>
<div class="paragraph"><p>JSON-RPC requests are now required to be over SSL if the site
prefers to use SSL for communication.
Prior to 2.1 the JSON-RPC requests from the web UI were performed
over https:// if the web UI loaded over https://, but JSON-RPC
requests from other tools (e.g. a command line script) were
still allowed over plain text HTTP.</p></div>
</li>
<li>
<p>
Work around NPE when patch list fails to compute
</p>
<div class="paragraph"><p>Rather than return NullPointerException to the browser return
a "not found" error, as the source of the null pointer is the
underlying diff operation returned no results.</p></div>
</li>
<li>
<p>
Fix stuck "Loading Gerrit Code Review &#8230;"
</p>
<div class="paragraph"><p>Many users have noticed that after about a week of server uptime
Gerrit no longer loads in their browser, until the server is
restarted.  This was usually caused by Jetty unpacking the WAR
file contents to /tmp, and the system having a cron task that
deleted files more than a week old from /tmp.
Under the daemon command the WAR file contents are unpacked into
<tt>$HOME/.gerritcodereview/tmp</tt>, which should be isolated from
the host system&#8217;s /tmp cleaner.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_other">Other=</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Pick up gwtexpui 1.1.4-SNAPSHOT
</p>
</li>
<li>
<p>
Merge change Ia64286d3
</p>
</li>
<li>
<p>
Merge branch <em>maint-2.0.24.1</em>
</p>
</li>
<li>
<p>
Merge change Ic6f00304
</p>
</li>
<li>
<p>
Merge branch <em>maint-2.0.24.2</em>
</p>
</li>
<li>
<p>
Add H2 database as a test dependency
</p>
</li>
<li>
<p>
Update Ehcache to 1.7.0
</p>
</li>
<li>
<p>
Fix formatting
</p>
</li>
<li>
<p>
Rewrite our build as modular maven components
</p>
</li>
<li>
<p>
Forbid use of anonymous servlets on any container
</p>
</li>
<li>
<p>
Use listeners to manage server startup/shutdown
</p>
</li>
<li>
<p>
Load additional JARs from $site_path/lib
</p>
</li>
<li>
<p>
Fix PostgreSQL/H2 access under gwtdebug sessions
</p>
</li>
<li>
<p>
Fix Become link in hosted mode debugging sessions
</p>
</li>
<li>
<p>
Fix ssh:// URLs on change pages
</p>
</li>
<li>
<p>
daemon: Update help for --slave option
</p>
</li>
<li>
<p>
daemon: Remove -DGerritServer from documentation
</p>
</li>
<li>
<p>
Launcher: Clarify the purpose of the daemon command
</p>
</li>
<li>
<p>
daemon: Fix --site-path documentation
</p>
</li>
<li>
<p>
Remove unused imports from pgm.DataSourceProvider
</p>
</li>
<li>
<p>
launcher: Don&#8217;t print stack trace with reflection frames
</p>
</li>
<li>
<p>
Move H2 database down into $site_path/db
</p>
</li>
<li>
<p>
Remove dead code identified by Eclipse 3.5.1
</p>
</li>
<li>
<p>
Add missing default serialVersionUID
</p>
</li>
<li>
<p>
pgm_daemon: Remove unnecessary -DGerritServer flag
</p>
</li>
<li>
<p>
Move configuration files under $site_path/etc
</p>
</li>
<li>
<p>
Update documentation to point to etc subdirectory
</p>
</li>
<li>
<p>
Display the full stack trace if requested
</p>
</li>
<li>
<p>
init: Don&#8217;t delete site path on database creation fail
</p>
</li>
<li>
<p>
Simplify errors reported by command line database fail
</p>
</li>
<li>
<p>
init: Correct defaults for httpd.listenUrl in --batch
</p>
</li>
<li>
<p>
issue 341    gsql: Fix \d on H2
</p>
</li>
<li>
<p>
gsql: Improve formatting of column types and indexes
</p>
</li>
<li>
<p>
pgm: Move non commands into a util package
</p>
</li>
<li>
<p>
issue 342    gsql: Reduce connections used to only 1
</p>
</li>
<li>
<p>
WorkQueue: Drop the word "-thread" from thread names
</p>
</li>
<li>
<p>
documentation: Correct links in dev-design
</p>
</li>
<li>
<p>
Fix port number in ssh pull lines in emails
</p>
</li>
<li>
<p>
Update MINA SSHD to 0.3.0
</p>
</li>
<li>
<p>
Update Jetty to 7.0.1.v20091125
</p>
</li>
<li>
<p>
launcher: Refactor how we return the status code
</p>
</li>
<li>
<p>
cat, ls: move inside our main program package
</p>
</li>
<li>
<p>
Default temporary directory to $HOME/.gerritcodereview
</p>
</li>
<li>
<p>
Clean up stale empty temporary directories
</p>
</li>
<li>
<p>
daemon: Unpack the WAR contents to a local directory
</p>
</li>
<li>
<p>
daemon: Run correctly under Eclipse debugger
</p>
</li>
<li>
<p>
Create a rc.d style start/stop script for our daemon
</p>
</li>
<li>
<p>
Remove unused ADMIN_PEOPLE link
</p>
</li>
<li>
<p>
Ignore unsupported ulimit -x errors
</p>
</li>
<li>
<p>
Use more portable printf instead of echo -n
</p>
</li>
<li>
<p>
Support starting as current user without start-stop-daemon
</p>
</li>
<li>
<p>
Make startup output universally the same
</p>
</li>
<li>
<p>
Get the canonical path to our temporary directory
</p>
</li>
<li>
<p>
init: Start daemon and open web browser when done
</p>
</li>
<li>
<p>
documentation: Clean up references to <em>Gerrit2</em>
</p>
</li>
<li>
<p>
Cleanup the reflog identity generation
</p>
</li>
<li>
<p>
Update to gwtjsonrpc 1.2.0-SNAPSHOT
</p>
</li>
<li>
<p>
init: Configure gerrit.canonicalWebUrl if reverse proxy
</p>
</li>
<li>
<p>
tools/version.sh: Quick hack to edit our Maven version
</p>
</li>
<li>
<p>
Call the next version 2.1
</p>
</li>
<li>
<p>
documentation: Rewrite installation guide
</p>
</li>
<li>
<p>
Fix gerrit.sh to run properly on SuSE systems
</p>
</li>
<li>
<p>
documentation: Fix formatting of remote.name.authGroup
</p>
</li>
<li>
<p>
Fix missing @Override warning in IoUtil
</p>
</li>
<li>
<p>
Don&#8217;t enable replication if replication.config is empty
</p>
</li>
<li>
<p>
Give H2 a canonical file path
</p>
</li>
<li>
<p>
init: Add --no-auto-start to prevent starting the daemon
</p>
</li>
<li>
<p>
init: Support updating an existing site configuration
</p>
</li>
<li>
<p>
init: Open browser to gerrit.canonicalWebUrl
</p>
</li>
<li>
<p>
daemon: Allow httpd.listenUrl to end with /
</p>
</li>
<li>
<p>
issue 358    init: Don&#8217;t abort on empty directory
</p>
</li>
<li>
<p>
init: Initialize system_config.site_path
</p>
</li>
<li>
<p>
Remove dead class MessagePanel
</p>
</li>
<li>
<p>
issue 331    documentation: Update developer docs
</p>
</li>
<li>
<p>
documentation: Link to apache2 reverse proxy setup
</p>
</li>
<li>
<p>
init: Fix LDAP prompts to store to ldap section
</p>
</li>
<li>
<p>
init: Store httpd.sslKeyPasword in secure.config
</p>
</li>
<li>
<p>
init: Fix a minor source code formatting error
</p>
</li>
<li>
<p>
commentlink: Support raw HTML replacements
</p>
</li>
<li>
<p>
documentation: Cleanup formatting in gerrit-config
</p>
</li>
<li>
<p>
Delete legacy schema upgrade scripts
</p>
</li>
<li>
<p>
Remove legacy tools/to_jetty.sh
</p>
</li>
<li>
<p>
Remove standalone Jetty 6.x support scripts
</p>
</li>
<li>
<p>
Move all resource files into src/main/resources
</p>
</li>
<li>
<p>
init: Move optional library download configuration
</p>
</li>
<li>
<p>
init: Refactor init to be small parts created
</p>
</li>
<li>
<p>
Test SitePaths class
</p>
</li>
<li>
<p>
Test SocketUtil class
</p>
</li>
<li>
<p>
Test init&#8217;s Libraries class
</p>
</li>
<li>
<p>
Test init&#8217;s upgrade from 2.0.x layout to 2.1 layout
</p>
</li>
<li>
<p>
pgm_daemon launch: Run ../test_site like docs suggest&#8230;
</p>
</li>
<li>
<p>
tools/version.sh: Don&#8217;t mangle the git describe output
</p>
</li>
<li>
<p>
Use SitePaths to locate the logs directory
</p>
</li>
<li>
<p>
Resolve out any symlinks before starting logging
</p>
</li>
<li>
<p>
Mark compressed log files read-only
</p>
</li>
<li>
<p>
tools/release.sh: Simplify our release build process
</p>
</li>
<li>
<p>
Teach Main to check the Java runtime version
</p>
</li>
<li>
<p>
documentation: Mention Google Code Prettify in licens&#8230;
</p>
</li>
<li>
<p>
Refactor GitRepositoryManager to be an interface
</p>
</li>
<li>
<p>
issue 346    Fix duplicate branches showing in the Branches tab
</p>
</li>
<li>
<p>
Completely remove GerritServer.properties
</p>
</li>
<li>
<p>
Clean up the DWIMery for database.* configuration set&#8230;
</p>
</li>
<li>
<p>
Never compress a pid file under $site_path/logs
</p>
</li>
<li>
<p>
Fix reading the $site_path/etc/ssh_host_key in serial&#8230;
</p>
</li>
<li>
<p>
gerrit 2.1
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.1 (from v2.1.1.1-104-gc20e283)<br />
Last updated 2013-05-08 07:50:03 PDT
</div>
</div>
</body>
</html>
